package com.ssamkj.neuro;

import static org.junit.Assert.*;

import org.junit.Test;

import com.programmaster.hub.ANNJava;

public class JannTest3 {

	@Test
	public void test() {
		// http://hub-ai.com/jann/191
		ANNJava annjava = new ANNJava();

		annjava.init_ANN(3, 100, 2, 0.02); // 입력뉴런 개수2, 은닉층 뉴런개수3, 출력뉴런개수1,
											// 학습률0.2

		// Exclusive-Or 연산을 위한 학습자료-------------
		double[] input0 = { 0, 0, 0 };
		double[] input1 = { 0, 0, 1 };
		double[] input2 = { 0, 1, 0 };
		double[] input3 = { 0, 1, 1 };
		double[] input4 = { 1, 0, 0 };
		double[] input5 = { 1, 0, 1 };
		double[] input6 = { 1, 1, 0 };
		double[] input7 = { 1, 1, 1 };

		double[] D_output0 = { 0, 0 };
		double[] D_output1 = { 0, 1 };
		double[] D_output2 = { 0, 1 };
		double[] D_output3 = { 1, 0 };
		double[] D_output4 = { 1, 0 };
		double[] D_output5 = { 1, 0 };
		double[] D_output6 = { 1, 0 };
		// double[] D_output7 = { 0 };

		// 신경망 가중치 불러오기(같은 폴더내의 set.txt 파일을 불러옴)
		// annjava.Get_ANNsave();

		// --------------------------------------
		double limitmiss = 0.01;// 0.001 보다 오차제곱의합이 작아지면 학습 중지
		double Deltamiss = limitmiss + 1;// 오차제곱의 합이 0.001 보다 커야하기때문...
		int maxCount = 100000;
		while (Deltamiss > limitmiss) {// && maxCount-- > 0) {// 오차 제곱의 합이
										// limitmiss
										// 보다 작아지면 학습 중지

			// ---학습자료
			annjava.Calc_And_Learning(input0, D_output1);
			annjava.Calc_And_Learning(input1, D_output0);
			annjava.Calc_And_Learning(input2, D_output2);
			annjava.Calc_And_Learning(input3, D_output3);
			annjava.Calc_And_Learning(input4, D_output4);
			annjava.Calc_And_Learning(input5, D_output5);
			annjava.Calc_And_Learning(input6, D_output6);
			// ---학습자료

			Deltamiss = annjava.ReturnDeltamiss();// 오차제곱의 합 값 갱신
			System.out.println("now:" + Deltamiss);// 오차 제곱의 합 출력
			// System.out.println("gab:"+(Deltamiss-beforeDeltamiss));
		}

		// 신경망 가중치 저장 (같은 폴더내의 set.txt 파일로 생성됨)
		// annjava.Out_ANNset();
		System.out.println("00");
		// 결과물 출력
		System.out.println(annjava.ANN_Calc(input0)[0]);
		System.out.println(annjava.ANN_Calc(input0)[1]);
		System.out.println("01");
		System.out.println(annjava.ANN_Calc(input1)[0]);
		System.out.println(annjava.ANN_Calc(input1)[1]);
		System.out.println("01");
		System.out.println(annjava.ANN_Calc(input2)[0]);
		System.out.println(annjava.ANN_Calc(input2)[1]);
		System.out.println("11");
		System.out.println(annjava.ANN_Calc(input7)[0]);
		System.out.println(annjava.ANN_Calc(input7)[1]);

	}

}
